home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / webbrowser.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  16KB  |  632 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import os
  5. import shlex
  6. import sys
  7. import stat
  8. import subprocess
  9. import time
  10. __all__ = [
  11.     'Error',
  12.     'open',
  13.     'open_new',
  14.     'open_new_tab',
  15.     'get',
  16.     'register']
  17.  
  18. class Error(Exception):
  19.     pass
  20.  
  21. _browsers = { }
  22. _tryorder = []
  23.  
  24. def register(name, klass, instance = None, update_tryorder = 1):
  25.     _browsers[name.lower()] = [
  26.         klass,
  27.         instance]
  28.     if update_tryorder > 0:
  29.         _tryorder.append(name)
  30.     elif update_tryorder < 0:
  31.         _tryorder.insert(0, name)
  32.     
  33.  
  34.  
  35. def get(using = None):
  36.     if using is not None:
  37.         alternatives = [
  38.             using]
  39.     else:
  40.         alternatives = _tryorder
  41.     for browser in alternatives:
  42.         if '%s' in browser:
  43.             browser = shlex.split(browser)
  44.             if browser[-1] == '&':
  45.                 return BackgroundBrowser(browser[:-1])
  46.             else:
  47.                 return GenericBrowser(browser)
  48.         browser[-1] == '&'
  49.         
  50.         try:
  51.             command = _browsers[browser.lower()]
  52.         except KeyError:
  53.             command = _synthesize(browser)
  54.  
  55.         if command[1] is not None:
  56.             return command[1]
  57.             continue
  58.         if command[0] is not None:
  59.             return command[0]()
  60.             continue
  61.     
  62.     raise Error('could not locate runnable browser')
  63.  
  64.  
  65. def open(url, new = 0, autoraise = 1):
  66.     for name in _tryorder:
  67.         browser = get(name)
  68.         if browser.open(url, new, autoraise):
  69.             return True
  70.             continue
  71.     
  72.     return False
  73.  
  74.  
  75. def open_new(url):
  76.     return open(url, 1)
  77.  
  78.  
  79. def open_new_tab(url):
  80.     return open(url, 2)
  81.  
  82.  
  83. def _synthesize(browser, update_tryorder = 1):
  84.     cmd = browser.split()[0]
  85.     if not _iscommand(cmd):
  86.         return [
  87.             None,
  88.             None]
  89.     
  90.     name = os.path.basename(cmd)
  91.     
  92.     try:
  93.         command = _browsers[name.lower()]
  94.     except KeyError:
  95.         return [
  96.             None,
  97.             None]
  98.  
  99.     controller = command[1]
  100.     if controller and name.lower() == controller.basename:
  101.         import copy as copy
  102.         controller = copy.copy(controller)
  103.         controller.name = browser
  104.         controller.basename = os.path.basename(browser)
  105.         register(browser, None, controller, update_tryorder)
  106.         return [
  107.             None,
  108.             controller]
  109.     
  110.     return [
  111.         None,
  112.         None]
  113.  
  114. if sys.platform[:3] == 'win':
  115.     
  116.     def _isexecutable(cmd):
  117.         cmd = cmd.lower()
  118.         if os.path.isfile(cmd) and cmd.endswith(('.exe', '.bat')):
  119.             return True
  120.         
  121.         for ext in ('.exe', '.bat'):
  122.             if os.path.isfile(cmd + ext):
  123.                 return True
  124.                 continue
  125.         
  126.         return False
  127.  
  128. else:
  129.     
  130.     def _isexecutable(cmd):
  131.         if os.path.isfile(cmd):
  132.             mode = os.stat(cmd)[stat.ST_MODE]
  133.             if mode & stat.S_IXUSR and mode & stat.S_IXGRP or mode & stat.S_IXOTH:
  134.                 return True
  135.             
  136.         
  137.         return False
  138.  
  139.  
  140. def _iscommand(cmd):
  141.     if _isexecutable(cmd):
  142.         return True
  143.     
  144.     path = os.environ.get('PATH')
  145.     if not path:
  146.         return False
  147.     
  148.     for d in path.split(os.pathsep):
  149.         exe = os.path.join(d, cmd)
  150.         if _isexecutable(exe):
  151.             return True
  152.             continue
  153.     
  154.     return False
  155.  
  156.  
  157. class BaseBrowser(object):
  158.     args = [
  159.         '%s']
  160.     
  161.     def __init__(self, name = ''):
  162.         self.name = name
  163.         self.basename = name
  164.  
  165.     
  166.     def open(self, url, new = 0, autoraise = 1):
  167.         raise NotImplementedError
  168.  
  169.     
  170.     def open_new(self, url):
  171.         return self.open(url, 1)
  172.  
  173.     
  174.     def open_new_tab(self, url):
  175.         return self.open(url, 2)
  176.  
  177.  
  178.  
  179. class GenericBrowser(BaseBrowser):
  180.     
  181.     def __init__(self, name):
  182.         if isinstance(name, basestring):
  183.             self.name = name
  184.             self.args = [
  185.                 '%s']
  186.         else:
  187.             self.name = name[0]
  188.             self.args = name[1:]
  189.         self.basename = os.path.basename(self.name)
  190.  
  191.     
  192.     def open(self, url, new = 0, autoraise = 1):
  193.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  194.         
  195.         try:
  196.             return not p.wait()
  197.         except OSError:
  198.             []
  199.             []
  200.             [
  201.                 self.name]
  202.             return False
  203.         except:
  204.             []
  205.  
  206.  
  207.  
  208.  
  209. class BackgroundBrowser(GenericBrowser):
  210.     
  211.     def open(self, url, new = 0, autoraise = 1):
  212.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  213.         
  214.         try:
  215.             if sys.platform[:3] == 'win':
  216.                 p = subprocess.Popen(cmdline)
  217.             else:
  218.                 setsid = getattr(os, 'setsid', None)
  219.                 if not setsid:
  220.                     setsid = getattr(os, 'setpgrp', None)
  221.                 
  222.                 p = subprocess.Popen(cmdline, close_fds = True, preexec_fn = setsid)
  223.             return p.poll() is None
  224.         except OSError:
  225.             []
  226.             []
  227.             [
  228.                 self.name]
  229.             return False
  230.         except:
  231.             []
  232.  
  233.  
  234.  
  235.  
  236. class UnixBrowser(BaseBrowser):
  237.     raise_opts = None
  238.     remote_args = [
  239.         '%action',
  240.         '%s']
  241.     remote_action = None
  242.     remote_action_newwin = None
  243.     remote_action_newtab = None
  244.     background = False
  245.     redirect_stdout = True
  246.     
  247.     def _invoke(self, args, remote, autoraise):
  248.         raise_opt = []
  249.         if remote and self.raise_opts:
  250.             autoraise = int(bool(autoraise))
  251.             opt = self.raise_opts[autoraise]
  252.             if opt:
  253.                 raise_opt = [
  254.                     opt]
  255.             
  256.         
  257.         cmdline = [
  258.             self.name] + raise_opt + args
  259.         if remote or self.background:
  260.             inout = file(os.devnull, 'r+')
  261.         else:
  262.             inout = None
  263.         setsid = getattr(os, 'setsid', None)
  264.         if not setsid:
  265.             setsid = getattr(os, 'setpgrp', None)
  266.         
  267.         if not self.redirect_stdout or inout:
  268.             pass
  269.         p = subprocess.Popen(cmdline, close_fds = True, stdin = inout, stdout = None, stderr = inout, preexec_fn = setsid)
  270.         if remote:
  271.             time.sleep(1)
  272.             rc = p.poll()
  273.             if rc is None:
  274.                 time.sleep(4)
  275.                 rc = p.poll()
  276.                 if rc is None:
  277.                     return True
  278.                 
  279.             
  280.             return not rc
  281.         elif self.background:
  282.             if p.poll() is None:
  283.                 return True
  284.             else:
  285.                 return False
  286.         else:
  287.             return not p.wait()
  288.  
  289.     
  290.     def open(self, url, new = 0, autoraise = 1):
  291.         if new == 0:
  292.             action = self.remote_action
  293.         elif new == 1:
  294.             action = self.remote_action_newwin
  295.         elif new == 2:
  296.             if self.remote_action_newtab is None:
  297.                 action = self.remote_action_newwin
  298.             else:
  299.                 action = self.remote_action_newtab
  300.         else:
  301.             raise Error("Bad 'new' parameter to open(); " + 'expected 0, 1, or 2, got %s' % new)
  302.         args = [ arg.replace('%s', url).replace('%action', action) for arg in self.remote_args ]
  303.         success = self._invoke(args, True, autoraise)
  304.  
  305.  
  306.  
  307. class Mozilla(UnixBrowser):
  308.     raise_opts = [
  309.         '-noraise',
  310.         '-raise']
  311.     remote_args = [
  312.         '-remote',
  313.         'openURL(%s%action)']
  314.     remote_action = ''
  315.     remote_action_newwin = ',new-window'
  316.     remote_action_newtab = ',new-tab'
  317.     background = True
  318.  
  319. Netscape = Mozilla
  320.  
  321. class Galeon(UnixBrowser):
  322.     raise_opts = [
  323.         '-noraise',
  324.         '']
  325.     remote_args = [
  326.         '%action',
  327.         '%s']
  328.     remote_action = '-n'
  329.     remote_action_newwin = '-w'
  330.     background = True
  331.  
  332.  
  333. class Opera(UnixBrowser):
  334.     raise_opts = [
  335.         '',
  336.         '-raise']
  337.     remote_args = [
  338.         '-remote',
  339.         'openURL(%s%action)']
  340.     remote_action = ''
  341.     remote_action_newwin = ',new-window'
  342.     remote_action_newtab = ',new-page'
  343.     background = True
  344.  
  345.  
  346. class Elinks(UnixBrowser):
  347.     remote_args = [
  348.         '-remote',
  349.         'openURL(%s%action)']
  350.     remote_action = ''
  351.     remote_action_newwin = ',new-window'
  352.     remote_action_newtab = ',new-tab'
  353.     background = False
  354.     redirect_stdout = False
  355.  
  356.  
  357. class Konqueror(BaseBrowser):
  358.     
  359.     def open(self, url, new = 0, autoraise = 1):
  360.         if new == 2:
  361.             action = 'newTab'
  362.         else:
  363.             action = 'openURL'
  364.         devnull = file(os.devnull, 'r+')
  365.         setsid = getattr(os, 'setsid', None)
  366.         if not setsid:
  367.             setsid = getattr(os, 'setpgrp', None)
  368.         
  369.         
  370.         try:
  371.             p = subprocess.Popen([
  372.                 'kfmclient',
  373.                 action,
  374.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull)
  375.         except OSError:
  376.             pass
  377.  
  378.         p.wait()
  379.         return True
  380.         
  381.         try:
  382.             p = subprocess.Popen([
  383.                 'konqueror',
  384.                 '--silent',
  385.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  386.         except OSError:
  387.             pass
  388.  
  389.         if p.poll() is None:
  390.             return True
  391.         
  392.         
  393.         try:
  394.             p = subprocess.Popen([
  395.                 'kfm',
  396.                 '-d',
  397.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  398.         except OSError:
  399.             return False
  400.  
  401.         return p.poll() is None
  402.  
  403.  
  404.  
  405. class Grail(BaseBrowser):
  406.     
  407.     def _find_grail_rc(self):
  408.         import glob as glob
  409.         import pwd as pwd
  410.         import socket as socket
  411.         import tempfile as tempfile
  412.         tempdir = os.path.join(tempfile.gettempdir(), '.grail-unix')
  413.         user = pwd.getpwuid(os.getuid())[0]
  414.         filename = os.path.join(tempdir, user + '-*')
  415.         maybes = glob.glob(filename)
  416.         if not maybes:
  417.             return None
  418.         
  419.         s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  420.         for fn in maybes:
  421.             
  422.             try:
  423.                 s.connect(fn)
  424.             except socket.error:
  425.                 
  426.                 try:
  427.                     os.unlink(fn)
  428.                 except IOError:
  429.                     pass
  430.                 except:
  431.                     None<EXCEPTION MATCH>IOError
  432.                 
  433.  
  434.                 None<EXCEPTION MATCH>IOError
  435.  
  436.             return s
  437.         
  438.  
  439.     
  440.     def _remote(self, action):
  441.         s = self._find_grail_rc()
  442.         if not s:
  443.             return 0
  444.         
  445.         s.send(action)
  446.         s.close()
  447.         return 1
  448.  
  449.     
  450.     def open(self, url, new = 0, autoraise = 1):
  451.         if new:
  452.             ok = self._remote('LOADNEW ' + url)
  453.         else:
  454.             ok = self._remote('LOAD ' + url)
  455.         return ok
  456.  
  457.  
  458.  
  459. def register_X_browsers():
  460.     if _iscommand('gconftool-2'):
  461.         gc = 'gconftool-2 -g /desktop/gnome/url-handlers/http/command 2>/dev/null'
  462.         out = os.popen(gc)
  463.         commd = out.read().strip()
  464.         retncode = out.close()
  465.         if retncode is None and commd:
  466.             register('gnome', None, BackgroundBrowser(shlex.split(commd)))
  467.         
  468.     
  469.     for browser in ('mozilla-firefox', 'firefox', 'mozilla-firebird', 'firebird', 'seamonkey', 'mozilla', 'netscape'):
  470.         if _iscommand(browser):
  471.             register(browser, None, Mozilla(browser))
  472.             continue
  473.     
  474.     if _iscommand('kfm'):
  475.         register('kfm', Konqueror, Konqueror('kfm'))
  476.     elif _iscommand('konqueror'):
  477.         register('konqueror', Konqueror, Konqueror('konqueror'))
  478.     
  479.     for browser in ('galeon', 'epiphany'):
  480.         if _iscommand(browser):
  481.             register(browser, None, Galeon(browser))
  482.             continue
  483.     
  484.     if _iscommand('skipstone'):
  485.         register('skipstone', None, BackgroundBrowser('skipstone'))
  486.     
  487.     if _iscommand('opera'):
  488.         register('opera', None, Opera('opera'))
  489.     
  490.     if _iscommand('mosaic'):
  491.         register('mosaic', None, BackgroundBrowser('mosaic'))
  492.     
  493.     if _iscommand('grail'):
  494.         register('grail', Grail, None)
  495.     
  496.  
  497. if os.environ.get('DISPLAY'):
  498.     register_X_browsers()
  499.  
  500. if os.environ.get('TERM'):
  501.     if _iscommand('links'):
  502.         register('links', None, GenericBrowser('links'))
  503.     
  504.     if _iscommand('elinks'):
  505.         register('elinks', None, Elinks('elinks'))
  506.     
  507.     if _iscommand('lynx'):
  508.         register('lynx', None, GenericBrowser('lynx'))
  509.     
  510.     if _iscommand('w3m'):
  511.         register('w3m', None, GenericBrowser('w3m'))
  512.     
  513.  
  514. if sys.platform[:3] == 'win':
  515.     
  516.     class WindowsDefault(BaseBrowser):
  517.         
  518.         def open(self, url, new = 0, autoraise = 1):
  519.             os.startfile(url)
  520.             return True
  521.  
  522.  
  523.     _tryorder = []
  524.     _browsers = { }
  525.     for browser in ('firefox', 'firebird', 'seamonkey', 'mozilla', 'netscape', 'opera'):
  526.         if _iscommand(browser):
  527.             register(browser, None, BackgroundBrowser(browser))
  528.             continue
  529.     
  530.     register('windows-default', WindowsDefault)
  531.  
  532.  
  533. try:
  534.     import ic
  535. except ImportError:
  536.     pass
  537.  
  538.  
  539. class InternetConfig(BaseBrowser):
  540.     
  541.     def open(self, url, new = 0, autoraise = 1):
  542.         ic.launchurl(url)
  543.         return True
  544.  
  545.  
  546. register('internet-config', InternetConfig, update_tryorder = -1)
  547. if sys.platform == 'darwin':
  548.     
  549.     class MacOSX(BaseBrowser):
  550.         
  551.         def __init__(self, name):
  552.             self.name = name
  553.  
  554.         
  555.         def open(self, url, new = 0, autoraise = 1):
  556.             if ':' not in url:
  557.                 url = 'file:' + url
  558.             
  559.             new = int(bool(new))
  560.             if self.name == 'default':
  561.                 script = 'open location "%s"' % url.replace('"', '%22')
  562.             elif self.name == 'OmniWeb':
  563.                 toWindow = ''
  564.             else:
  565.                 toWindow = 'toWindow %d' % (new - 1)
  566.             cmd = 'OpenURL "%s"' % url.replace('"', '%22')
  567.             script = 'tell application "%s"\n                                activate\n                                %s %s\n                            end tell' % (self.name, cmd, toWindow)
  568.             osapipe = os.popen('osascript', 'w')
  569.             if osapipe is None:
  570.                 return False
  571.             
  572.             osapipe.write(script)
  573.             rc = osapipe.close()
  574.             return not rc
  575.  
  576.  
  577.     register('MacOSX', None, MacOSX('default'), -1)
  578.  
  579. if sys.platform[:3] == 'os2' and _iscommand('netscape'):
  580.     _tryorder = []
  581.     _browsers = { }
  582.     register('os2netscape', None, GenericBrowser([
  583.         'start',
  584.         'netscape',
  585.         '%s']), -1)
  586.  
  587. if 'BROWSER' in os.environ:
  588.     _userchoices = os.environ['BROWSER'].split(os.pathsep)
  589.     _userchoices.reverse()
  590.     for cmdline in _userchoices:
  591.         if cmdline != '':
  592.             _synthesize(cmdline, -1)
  593.             continue
  594.     
  595.     cmdline = None
  596.     del cmdline
  597.     del _userchoices
  598.  
  599.  
  600. def main():
  601.     import getopt as getopt
  602.     usage = 'Usage: %s [-n | -t] url\n    -n: open new window\n    -t: open new tab' % sys.argv[0]
  603.     
  604.     try:
  605.         (opts, args) = getopt.getopt(sys.argv[1:], 'ntd')
  606.     except getopt.error:
  607.         msg = None
  608.         print >>sys.stderr, msg
  609.         print >>sys.stderr, usage
  610.         sys.exit(1)
  611.  
  612.     new_win = 0
  613.     for o, a in opts:
  614.         if o == '-n':
  615.             new_win = 1
  616.             continue
  617.         if o == '-t':
  618.             new_win = 2
  619.             continue
  620.     
  621.     if len(args) != 1:
  622.         print >>sys.stderr, usage
  623.         sys.exit(1)
  624.     
  625.     url = args[0]
  626.     open(url, new_win)
  627.     print '\x07'
  628.  
  629. if __name__ == '__main__':
  630.     main()
  631.  
  632.